// 用户自定义的窗口监听交互js文件
import { ipcMain, app, dialog, shell } from 'electron';
import { sendUpdateWinSize, downloadFile, getMainPath } from './utils';
import * as fs from 'fs';
import * as path from 'path';
import * as os from 'os';
import * as osu from 'os-utils';



let systemInfo = {
    platform: osu.platform()
};//cpu和内存


async function getSystemInfo() {
    const bytesToSize = (bytes) => {
        const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
        if (bytes === 0) return '0 Byte';
        const i = Math.floor(Math.log(bytes) / Math.log(1024));
        return parseFloat((bytes / Math.pow(1024, i)).toFixed(2)) + ' ' + sizes[i];
    };

    function getCPUUsage() {
        return new Promise((resolve, reject) => {
            osu.cpuUsage(function (v) {
                v = parseInt(v * 100);//下一秒的cpu使用率百分比
                resolve(v)
            });
        });
    }

    const cpuCount = os.cpus().length;  // CPU核数
    const uptime = os.uptime();  // 系统运行时间
    const totalMemory = os.totalmem();  // 总内存大小
    const freeMemory = os.freemem();  // 空闲内存大小
    const memoryUsage = parseFloat(((totalMemory - freeMemory) / totalMemory * 100).toFixed(2));  // 内存使用率

    const cpuPercent = await getCPUUsage();  // CPU使用率


    // 封装为对象
    const systemInfo = {
        cpuCores: cpuCount,
        cpuUsage: cpuPercent,
        memoryUsage: memoryUsage,
        totalMemory: bytesToSize(totalMemory),
        usedMemory: bytesToSize(totalMemory - freeMemory),
        uptime
    };

    return systemInfo;
}
// // 最开始执行一次
getSystemInfo().then(res => {
    systemInfo = { ...systemInfo, ...res };
});


/**
 * @param {mainWindow} mainWindow 主窗口
 */
export default function (mainWindow) {

    // 监听窗口的
    /**
     * 监听窗口更改事件
     */
    mainWindow.on('resized', (e) => {
        // 渲染进程发送信息 (通知窗口大小更新了,并给予值)
        sendUpdateWinSize(mainWindow);
    });



    /**
     * 最小化时
     */
    mainWindow.on('minimize', (event) => {

    });

    /**
     * 最大化时
     */
    mainWindow.on('maximize', (event) => {
        // 渲染进程发送信息 (通知窗口大小更新了,并给予值)
        sendUpdateWinSize(mainWindow);
        // 给渲染进程发送信息(告诉窗口最大化更新)
        mainWindow.webContents.send('update-maximize', true);
    });

    /**
    * 退出最大化时(还原)
    */
    mainWindow.on('unmaximize', (event) => {
        // 渲染进程发送信息 (通知窗口大小更新了,并给予值)
        sendUpdateWinSize(mainWindow);
        // 给渲染进程发送信息(告诉窗口最大化更新)
        mainWindow.webContents.send('update-maximize', false);
    });

    // 监听用户自定义的

    /**
     * 要求最小化
     */
    ipcMain.on('user_minimize', (event, data) => {
        if (!mainWindow.isMinimized()) {
            // 如果没有最小化就设置最小化
            mainWindow.minimize();
        }
    });

    /**
     * 要求最大化(或者还原)
     */
    ipcMain.on('user_maximize', (event, data) => {
        if (!mainWindow.isMaximized()) {
            // 如果没有最大化就设置最大化
            mainWindow.maximize();
            // 同步回复(用ipcRenderer.sendSync才会生效)
            event.returnValue = true;
            return;
        }
        // 否则就还原窗口大小
        mainWindow.unmaximize();
        // 同步回复(用ipcRenderer.sendSync才会生效)
        event.returnValue = false;
    });

    /**
     * 要求隐藏窗口(这边是直接隐藏)
     */
    ipcMain.on('user_win-hide', (event, data) => {
        mainWindow.hide();
    });

    /**
     * 打开选择目录(文件)的弹窗
     * @param {Boolean} type true是目录 false是文件
     */
    ipcMain.handle('user_showOpenDialog', async (event, type, filters = []) => {
        let propeType = ['openDirectory'];
        if (!type) propeType[0] = 'openFile';//设置文件
        return await dialog.showOpenDialog({
            properties: propeType,
            filters//限制文件后缀数组
        }).catch(err => {
            console.log(err);
        });
    });

    /**
     * 设置开机自启的功能
     */
    ipcMain.on('user_setOpenRun', (e, status) => {
        app.setLoginItemSettings({
            openAtLogin: status, // 在登录时自动启动
            path: app.getPath('exe'), // 应用程序的路径
            args: ['--env', 'production'] // 设置运行环境参数
        });
    });


    /**
     * 获取内存和cpu信息
     */
    ipcMain.handle('getSystemInfo', async (e, status) => {
        if (status) {
            let newSInfo = await getSystemInfo();
            systemInfo = { ...systemInfo, ...newSInfo }
        }

        const uptime = os.uptime();
        systemInfo.uptime = uptime;
        return systemInfo;
    });


    /**
     * 调用主进程下载文件(资源包)
     */
    ipcMain.handle('download_file', async (e, url, uuid) => {
        let dirresBundle = path.join(getMainPath(), './datas/resBundle');//资源包
        return await downloadFile(url, dirresBundle, `${uuid}.zip`, progress => {
            mainWindow.webContents.send('download_file_progress', progress);
        });
    });


    // /**
    //  * 软件配置文件更新了
    //  */
    // let settingPath = path.join(process.cwd(),'./datas');
    // if (!fs.existsSync(settingPath)) fs.mkdirSync(settingPath, { recursive: true });
    // fs.watch(settingPath, (eventType, filename) => {
    //     if (filename == 'setting.json') {
    //         mainWindow.webContents.send('update-setting');
    //     }
    // });
}
